/**
 * 
 */
package ikelib;

/**
 * 分散を計算する
 * 
 * @author ikechan
 *
 */
public class Variance {
	/**
	 * 分散、不偏分散、標準偏差を計算する。 lengthの区間毎に計算する。
	 * @param in　入力データ
	 * @param length　計算区間
	 * @param unbiased　不偏分散かどうか
	 * @param stddiv 標準偏差を計算する。
	 * @return
	 */
	public static double[] calc(double[] in, int length, boolean unbiased,boolean stddiv){
		int len = in.length/length;
		if(len == 0) return null;
		double[] ret = new double[len];
		for(int j=0;j<len;j++){
			// 平均を計算して
			double mean = 0.0;
			for(int i=0;i<length;i++){
				mean += in[j*len + i];
			}
			mean /= length;
			//　分散を計算
			double v = 0.0;
			for(int i=0;i<length;i++){
				double vv = in[j*len + i] - mean;
				v += vv*vv;
			}
			if(unbiased){
				v /= (length-1);
			}
			else{
				v /= (length);
			}
			if(stddiv){
				ret[j]= Math.sqrt(v);
			}
			else{
				ret[j]=v;
			}
		}
		return ret;
	}
}
